package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * 抽象类是作为继承层次中的祖先类而存在的,它可以定义普通类能够定义的所有结构
 *      还可以定义独有的抽象方法.
 * 接口仅表示功能的扩展,接口的实现是多实现,接口的使用要灵活非常多.
 *
 * 自此，我们已经引入了接口的概念。接下来，我们重点来研究一个接口的特点和使用。
 * 接口的特点我们主要研究以下方面
 *
 *      1.接口的声明特点
 *          和class类的声明类似,可以使用访问权限修饰符
 *          接口默认就是abstract修饰的,接口默认就是抽象的,所以它可以定义抽象方法
 *              既然是默认的修饰符,那就不要写出来了
 *          final是不可以的,它和abstract关键字是冲突的
 *
 *      2.接口的实现类的书写格式
 *          接口在命名时,可以选择以"I"开头,以表示这是一个接口
 *          接口的实现类
 *          很多程序员习惯于用"接口名+Impl"表示这是某个接口的实现类
 *          当然如果直接在接口所处包下写实现类,建议在该包下新建一个包叫"impl"
 *
 *      3.成员特点
 *          接口毕竟不是类,那么接口中能够定义的结构有哪些呢?
 *          a.定义属性(变量)
 *              可以定义,但实际上接口中定义的变量默认都是"public static final"
 *              修饰的公共的全局常量
 *              注意:
 *                  1.当然这些隐含的修饰符就不要写出来了.
 *                  2.接口中没有静态代码块,所以接口中的全局常量的赋值必须显式赋值
 *                  3.(重点)接口设计出来的目的就是为了被实现的,所以为了鼓励实现
 *                      接口中所有能够定义的结构,访问权限修饰符统统默认是public
 *                      并且不可以修改访问权限
 *                  4.(重点)接口侧重于行为,侧重于表示功能的扩展,所以
 *                      日常开发中定义和使用的接口绝大多数都不会定义全局常量
 *                      只有当:
 *                      接口的所有实现类都需要某个全局常量时,才会把该全局常量定义在接口中
 *                      (这种需求几乎没见过)
 *          b.定义行为(方法)
 *                  接口中允许定义方法,但接口中定义的方法默认都是public abstract修饰的抽象方法
 *                  当然在Java8及以后版本的接口中,允许定义实现方法了.(待会再讲)
 *                  强调:
 *                      a.接口中绝大多数都只会定义抽象方法,如无绝对必要接口中是不会有实现方法
 *                      b.隐含的,默认的修饰符"public abstract"不要写出来,写出来是错的
 *
 *          c.构造器
 *                  接口自身不能new对象,而且接口中也没有成员变量需要赋值
 *                  所以接口是不需要构造器的
 *                  接口没有构造器
 *          d.代码块
 *                  接口没有构造代码块,也没有静态代码块
 *   以上总结:
 *          接口中可以定义全局常量和抽象方法,并且定义时可以省略修饰符
 *          实际开发中,绝大多数接口在定义时都只有抽象方法,接口的定义非常简洁
 *          当然在Java8及以后版本的接口中,允许定义实现方法了.
 *
 * 接口的使用，我们主要探讨它的子类特点。
 * 接口的实现类:
 *      1.普通类,普通类实现接口,必须实现所有的抽象方法
 *      2.抽象类,抽象类实现接口,可以选择实现抽象方法
 *
 * 接口能不能继承类?
 *      接口是不可能直接是继承某个类的,但实际上在底层接口是继承Object的
 *
 * 接口之间的继承:
 *      接口是可以继承接口的,而且接口的继承是多继承
 *
 * 以上总结,普通类,抽象类,接口之间的继承(extends)以及实现(implements)
 *      1.继承(extends)是不能跨越种族的,类和类继承,接口和接口继承
 *          并且类的继承是单继承,接口的继承是多继承
 *      2.implements实现的关系,只发生在类实现接口当中
 *      3.接口和类之间既不能继承,也没有实现
 *
 * @since 09:27
 * @author wuguidong@cskaoyan.onaliyun.com
 */

public interface ITest {
    // Variable 'a' might not have been initialized
    // Modifier 'final' is redundant for interface fields
    public static final int NUM = 100;

    // 日常假如需要在接口中定义全局常量,就按照以下格式定义
    int NUM2 = 200;
    String str = "hello world!";

    // Interface abstract methods cannot have body
    // public void test(){}

    // 日常开发中,接口中定义抽象方法
    void test();

    int test2();
}

abstract class IBImpl implements IB {
    @Override
    public void test() {
        System.out.println("hello world!");
    }
}

// 日常开发中,我们见到和使用的接口大多都比较简洁,一般定义如下
interface IB extends IA, IC {
    void test();

    int test2();

    String test3(int a);
}


// Modifier 'abstract' is redundant for interfaces
abstract interface IA {
}

interface IC {
}

class A {
}